Python设计模式(3):抽象工厂模式 您所在的位置:网站首页 类图 python Python设计模式(3):抽象工厂模式

Python设计模式(3):抽象工厂模式

2024-04-15 05:04| 来源: 网络整理| 查看: 265

导言

为了说明抽象工厂模式引入的背景首先回忆起Python设计模式(2):工厂方法模式类图。从图中可以看到,在工厂方法模式中针对一组产品类构造了另外一组工厂类,并且工厂类与产品类有相同的结构。假如现在有两组以上具有相同结构的产品类,是否还可以使用工厂方法模式呢?例如有3组产品,鞋(Shoes)、西装(Suit)和领带(Tie),如图所示,每类产品都分为男女两类。问题:此时是否还可以使用以上的工厂方法模式?如果回答为是,怎样应用工厂方法模式?

解决方案1:一种可能的解决方法是为每个产品层次类创建一个Creator层次类。这种方法有一个缺点,就是需要至少3个Creator层次类。这种办法是可行的,但是太麻烦。

解决方案2:以上3个层次类具有相同的结构,可以改造以上所述的工厂方法模式,使得只需要一个工厂层次类就可以担负起创建3组产品对象的责任。设计图如图所示。

第二种解决方案就是将要讲述的抽象工厂模式(Abstract Factory Pattern),包含两个产品类的的抽象工厂模式设计类图如图所示。

抽象工厂模式与工厂方法模式有相似的概念。抽象工厂模式与工厂模式一样是层次类的结构,但是在这里它不仅仅负责创建一个产品类的对象,而是一族产品类对象。在程序中,它可以是接口或者抽象类。

抽象工厂模式中包含:

一系列互相有关联的产品类,这些产品类有相同的结构。一系列实的工厂类,实现由抽象工厂类提供的接口。每个实的工厂类生产一组相关的产品类的对象。

当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时,可以应用抽象工厂模式。如果不使用抽象工厂模式,创建对象的条件语句将会出现在客户程序的许多地方,程序的可维护性差。抽象工厂模式帮助程序员避免了以上所述的重复的、复杂的条件语句,提供了必要的创建对象的接口。

from abc import ABC, abstractmethod # 下面的类为工厂类接口及其子类 class Creator(ABC): @abstractmethod def factory_a(self): pass @abstractmethod def factory_b(self): pass @staticmethod def get_creator(option): if option == '1': return ConcreteCreatorA() elif option == '2': return ConcreteCreatorB() class ConcreteCreatorA(Creator): def factory_a(self): return ProductA1() def factory_b(self): return ProductB1() class ConcreteCreatorB(Creator): def factory_a(self): return ProductA2() def factory_b(self): return ProductB2() # 以下类为产品类接口及其实现子类的代码 class ProductA(ABC): @abstractmethod def get_product(self): pass class ProductA1(ProductA): def get_product(self): return'ProductA1' class ProductA2(ProductA): def get_product(self): return'ProductA2' class ProductB(ABC): @abstractmethod def get_product(self): pass class ProductB1(ProductB): def get_product(self): return'ProductB1' class ProductB2(ProductB): def get_product(self): return'ProductB2' class Client: @staticmethod def main(): # 获取产品类型与种类 product_class = input("产品种类:").upper() # A B product_type = input("产品类型:") # 1 2 # 获取具体工厂子类对象 creator = Creator.get_creator(product_type) # 获得具体的产品对象 if product_class == 'A': product = creator.factory_a() print(product.get_product()) elif product_class == 'B': product = creator.factory_b() print(product.get_product()) if __name__ == '__main__': Client.main()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有